package com.seelyn.rhea.mvc.context;

import javax.servlet.http.HttpSession;
import java.util.Set;

/**
 * @author slacrey
 * @since 2016/1/23
 */
public interface Session {

    /**
     * @return 原始的Servlet容器的{@code HttpSession}对象.
     */
    HttpSession raw();

    /**
     * 返回在本次会话中与指定名称绑定的对象
     *
     * @param name 指定对象名称的字符串
     * @param <T>  类型参数
     * @return 指定名称的对象
     */
    <T> T attribute(String name);

    /**
     * 使用指定的名称将对象绑定到该会话
     *
     * @param name  对象绑定的名称，不能为空
     * @param value 被绑定的对象
     */
    void attribute(String name, Object value);

    /**
     *
     * @return 包含所有绑定到本次会话的对象的名称Set
     */
    Set<String> attributes();

    /**
     * @return 创建{@code HttpSession}的时间毫秒
     */
    long creationTime();

    /**
     * @return 本次会话的唯一标识符
     */
    String id();

    /**
     * @return 最后一次访问的时间毫秒
     */
    long lastAccessedTime();

    /**
     * @return 最大时间间隔（单位 秒）在次时间，将保持会话
     */
    int maxInactiveInterval();

    /**
     * 指定最大时间间隔，超过这个时间间隔秒，会话将失效
     *
     * @param interval 时间间隔 秒
     */
    void maxInactiveInterval(int interval);

    /**
     * 设置会话失效
     */
    void invalidate();

    /**
     * @return true if the client does not yet know about the session or if the client chooses not to join the session.
     */
    boolean isNew();

    /**
     * 从会话中删除与指定名称绑定的对象
     *
     * @param name 将删除的会话名称
     */
    void removeAttribute(String name);

}
